﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.ModelBinding;
using System.Web.UI;
using System.Web.UI.WebControls;
using Box.BL;
using Box.Entities;
using Microsoft.Practices.Unity;

namespace Box.Cliente.Almacen
{
    public partial class frmOrdenCompra : System.Web.UI.Page
    {
        private const string KEYCOMPRA = "compra";
        [Dependency]
        public IInsumoBL insumoService { get; set; }
        [Dependency]
        public ICompraBL CompraBL { get; set; }
        [Dependency]
        public IProveedorBL proveedorService { get; set; }
        protected void Page_Load(object sender, EventArgs e)
        {
            var opc = Request.QueryString["opc"];
            var idCompra = Request.QueryString["id"];

            if (!Page.IsPostBack)
            {
                if (opc != null && opc.Equals("nuevo"))
                {
                    //ViewState["opc"] = "nuevo";

                    var compra = new Compra()
                    {
                        FechaCompra=DateTime.Now

                    };

                   // lblTotal.Text = compra.Total.ToString();

                    BindingCompra(compra);

                    Cache.Insert("compra", compra);
                    ViewState["opc"] = opc;
                }
                else if (opc != null && opc == "editar" && idCompra != null)
                {
                    var compra = CompraBL.GetFromComprasById(Int32.Parse(idCompra));
                    BindingCompra(compra);
                    Cache.Insert("compra", compra);
                    ViewState["opc"] = opc;
                }
            }
        }
        public IQueryable<Insumo> GetProductos([Control("txtCriterio")] string criterio)
        {
            return insumoService.GetFromInsumosByCriterio(criterio).AsQueryable();
        }
        #region Enlace compra
        private void BindingCompra(Compra compra)
        {
            //hfIdCompra.Value = compra.Id.ToString();

            txtFecha.Text = compra.FechaCompra.ToShortDateString();

            if (compra.Proveedor != null)
            {
                //txtRuc.Text = compra.Proveedor.RucProvedor;
                //txtCliente.Text = compra.Proveedor.NombreEmpresa;
                //txtDireccion.Text = compra.Proveedor.DireccionProveedor;
            }

            //para que el total sea el resultado de las suma de todos los montos
            compra.Total = compra.DetalleCompras.Sum(dp => dp.Monto);

            lvDetCompra.DataSource = compra.DetalleCompras;
            lvDetCompra.DataBind();

            if (compra.DetalleCompras.Count > 0)
            {
                var lblTotal = lvDetCompra.FindControl("lblTotal") as Label;
                lblTotal.Text = compra.Total.ToString();
            }

        }
        #endregion

        protected void lvProductos_ItemCommand(object sender, ListViewCommandEventArgs e)
        {
            if (e.CommandName == "AddDetalle")
            {
                var insumoId = Int32.Parse(e.CommandArgument.ToString());
                var insumo = insumoService.GetFromInsumosById(insumoId);

                var compra = Cache.Get("compra") as Compra;

                var existe = compra.DetalleCompras.SingleOrDefault(i => i.IdInsumo.Equals(insumoId));

                if (existe == null)
                {
                    var newInsumos = new DetalleCompra()
                    {
                        Cantidad = 1,
                        Insumo = insumo,
                        IdInsumo = insumoId,
                        IdCompra = compra.Id,
                        PrecioUnit = insumo.Precio

                    };
                    compra.DetalleCompras.Add(newInsumos);
                }
                else
                {
                    existe.Cantidad += 1;
                }
                //compra.Total = compra.DetalleCompra.Sum(i => i.Monto);

                BindingCompra(compra);

                Cache.Insert("compra", compra);
            }
        }

        #region ya no mas boton update
        protected void txtCantidad_TextChanged(object sender, EventArgs e)
        {
            var compra = Cache.Get("compra") as Compra;

            foreach (var row in lvDetCompra.Items)
            {
                var txtCantidad = row.FindControl("txtCantidad") as TextBox;
                var txtPrecio = row.FindControl("txtPrecio") as TextBox;

                compra.DetalleCompras.ToList()[row.DisplayIndex].Cantidad = Int32.Parse(txtCantidad.Text);
                compra.DetalleCompras.ToList()[row.DisplayIndex].PrecioUnit = Int32.Parse(txtPrecio.Text);
            }
            BindingCompra(compra);

            Cache.Insert("compra", compra);
        }
        protected void txtPrecio_TextChanged(object sender, EventArgs e)
        {
            var compra = Cache.Get("compra") as Compra;

            foreach (var row in lvDetCompra.Items)
            {
                var txtCantidad = row.FindControl("txtCantidad") as TextBox;
                var txtPrecio = row.FindControl("txtPrecio") as TextBox;

                compra.DetalleCompras.ToList()[row.DisplayIndex].Cantidad = Int32.Parse(txtCantidad.Text);
                compra.DetalleCompras.ToList()[row.DisplayIndex].PrecioUnit = Int32.Parse(txtPrecio.Text);
            }
            BindingCompra(compra);

            Cache.Insert("compra", compra);
        }
        #endregion

        protected void lvDetCompra_ItemCommand(object sender, ListViewCommandEventArgs e)
        {
            if (e.CommandName == "QuitarDetalle")
            {
                var insumoId = Int32.Parse(e.CommandArgument.ToString());

                var compra = Cache.Get("compra") as Compra;

                //item es un insumo agrgado al detalle
                var item = compra.DetalleCompras.SingleOrDefault(i => i.IdInsumo.Equals(insumoId));

                if (item != null)
                {
                    //verificamos que si la cantidad del item en el detalle es == 1
                    //si es verdadero borrara el item del detalle
                    if (item.Cantidad == 1)
                    {
                        compra.DetalleCompras.Remove(item);
                    }
                    //si la condicion del if es falsa, entonces solo disminuira la cantidad del item
                    item.Cantidad -= 1;
                }

                BindingCompra(compra);

                Cache.Insert("compra", compra);
            }
            else if (e.CommandName == "ActualizarDetalle")
            {
                var compra = Cache.Get("compra") as Compra;

                foreach (var row in lvDetCompra.Items)
                {
                    var txtCantidad = row.FindControl("txtCantidad") as TextBox;
                    var txtPrecio = row.FindControl("txtPrecio") as TextBox;

                    compra.DetalleCompras.ToList()[row.DisplayIndex].Cantidad = Int32.Parse(txtCantidad.Text);
                    compra.DetalleCompras.ToList()[row.DisplayIndex].PrecioUnit = Int32.Parse(txtPrecio.Text);
                }
                BindingCompra(compra);

                Cache.Insert("compra", compra);
            }
        }

        protected void btnGuardar_Click(object sender, EventArgs e)
        {
            if (ViewState["opc"].ToString() == "editar")
            {
                var compra = Cache.Get("compra") as Compra;


                CompraBL.UpdateCompra(compra);

                Response.Redirect("frmListCompras.aspx");

            }
            else if (ViewState["opc"].ToString() == "nuevo")
            {
                var compra = Cache.Get("compra") as Compra;

                //compra.IdTipoDocumento = Int32.Parse(ddlDocumento.SelectedValue.ToString());
                compra.NumDocumento = txtCodigo.Text;
                #region Seleccionar Archivo

                #endregion

                compra.FechaCompra = DateTime.Now;
                //compra.TipoPago = ddlTipoPago.SelectedValue;

                CompraBL.AddCompra(compra);

                Response.Redirect("frmListCompras.aspx");
            }
        }
        #region Buscar PRoveedor
        protected void btnBuscarProveedor_Click(object sender, EventArgs e)
        {
            var rucDni = txtRuc.Text;

            var proveedor = proveedorService.GetFromProveedorByRuc(rucDni);

            var compra = Cache.Get(KEYCOMPRA) as Compra;

            if (proveedor==null)
            {
                txtRuc.Text = "";
                txtProveedor.Text = "";
                compra.Proveedor = null;
                  Page.ClientScript.RegisterStartupScript(this.GetType(),
                              "mensaje",
                                 "<script type=\"text/javascript\">" +
                                    "alert(\'El PROVEEDOR no existe.!!\');" +
                                      "</script>", true);
            }
            else
            {
                compra.IdProveedor = proveedor.Id;
                compra.Proveedor = proveedor;

                Cache.Insert(KEYCOMPRA,compra);

                txtRuc.Text = proveedor.RucProvedor;
                txtProveedor.Text = proveedor.NombreEmpresa;

            }
        }
        #endregion
    }
}